append([], X, X).
append( [H | T], Y, [H | Z]) :- append(T, Y, Z).

%last(?L, ?U)
%last([X|[]], X).
%last([_|[Y|XS]], Z) :- last([Y|XS], Z).

last(X, Z) :- append(_, [Z], X).


%removeLast(+L, -L1)
removeLast([_], []).
removeLast([X|[Y|XS]], [X|ZS]) :- removeLast([Y|XS], ZS).

%reverse(+L, -L1)
reverse([], []).
reverse([X|XS], YS) :- reverse(XS, W), append(W, [X], YS).

% reverse([], []).
% reverse(XS, [Y|YS]) :- last(XS, Y), removeLast(XS, ZS), reverse(ZS, YS). 

% maxlista(+L, -M)
maxlista([X], X).
maxlista([X|XS], Y) :- maxlista(XS, W), Y is max(X, W).

% palindromo(+L, -L1)
palindromo(L, Res) :- reverse(L, LRev), append(L, LRev, Res).

%doble(?L, ?L1)
doble([], []).
doble([X|XS], [X|[X|YS]]) :- doble(XS, YS).

%prefijo(?P, +L)
prefijo(P, L) :- append(P, _, L).

%sufijo(?S, +L)
sufijo(S, L) :- append(_, S, L).

%sublista(?S, +L)
sublista(S, L) :- sufijo(W, L), prefijo(S, W).

% iesimo(?I, +L, -R)
iesimo(1, [X|_], X).
iesimo(Y, [_|XS], R) :- iesimo(W, XS, R), Y is W + 1.

% pertenece(?X, +L)
pertenece(X, [X|_]).
pertenece(X, [_|YS]) :- pertenece(X, YS).







